package com.hundun.vision.biz.utils;

/**
 * @author ：RuoChen
 * @date ：17:23 2020/12/14
 * @description：日期工具类
 */

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Date;

public class TimeUtils {

    /**
     * 获取开始时间（秒）
     *
     * @param endTime
     * @param interval
     * @param limit
     * @return
     */
    public static String getStartTime(Long endTime, String interval, String limit) {
        Long seconds = getDuration(interval);
        Integer counts = Integer.valueOf(limit);
        Long duration = seconds * counts;
        Long startTime = endTime - duration;
        return startTime.toString();
    }

    /**
     * 获取开始时间（毫秒）
     *
     * @param interval 时间间隔，比如 "1m", "5m", "1h" 等
     * @param limit    要获取的时间间隔数量
     * @return 开始时间的秒数
     */
    public static Long getStartTime(String interval, int limit) {
        long currentEpochSeconds = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
        long intervalSeconds = getDuration(interval);
        // 获取当前时间对应的时间间隔的开始时间
        long currentIntervalStart = currentEpochSeconds - (currentEpochSeconds % intervalSeconds);
        // 获取当前时间对应的时间间隔的结束时间
        long currentIntervalEnd = currentIntervalStart + intervalSeconds;
        // 计算当前时间所处的时间间隔
        long currentTime = currentEpochSeconds % intervalSeconds;
        // 计算开始时间
        long startTime = currentIntervalStart - (limit - 1) * intervalSeconds;
        // 如果当前时间距离当前时间间隔的结束时间不足limit-1个时间间隔，则返回当前时间间隔的开始时间
        if (currentTime >= (limit - 1) * intervalSeconds) {
            startTime = currentIntervalStart - (limit - 2) * intervalSeconds;
        }
        return 1000 * startTime;
    }

    /**
     * 获取时间间隔（秒）
     *
     * @param interval
     * @return
     */
    public static Long getDuration(String interval) {
        Long seconds = 1L;
        if (interval.contains("m")) {
            String replace = interval.replace("m", "");
            Long number = Long.valueOf(replace);
            return 60 * number;
        } else if (interval.contains("h")) {
            String replace = interval.replace("h", "");
            Long number = Long.valueOf(replace);
            return 60 * 60 * number;
        } else if (interval.contains("d")) {
            String replace = interval.replace("d", "");
            Long number = Long.valueOf(replace);
            return 24 * 60 * 60 * number;
        } else if (interval.contains("M")) {
            String replace = interval.replace("M", "");
            Long number = Long.valueOf(replace);
            return 30 * 24 * 60 * 60 * number;
        }
        return seconds;
    }


    /**
     * 判断时间是否为指定间隔时间，例如整10分钟
     *
     * @param date
     * @param interval
     * @return
     */
    public static boolean match(Date date, int interval) {
        LocalDateTime localDateTime = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
        int minute = localDateTime.getMinute();
        int second = localDateTime.getSecond();
        int milliseconds = localDateTime.getNano() / 1000000;
        if (minute % interval == 0 && second == 0 && milliseconds < 200) {
            return true;
        } else {
            return false;
        }
    }
}
